handle errors when automated renaming for name rules is failing
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Wed, 19 Feb 2025 08:16:14 +0000 (09:16 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Wed, 19 Feb 2025 13:12:37 +0000 (13:12 +0000)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/discovery.cpp
src/libsync/discovery.h

index 1cd9f6f3006f2dffb861351134cdd5c9c65c28fb..23800013b0a1e7566cf6709640fd483d70379a54 100644 (file)
@@ -425,17 +425,23 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
         case CSYNC_FILE_EXCLUDE_TRAILING_SPACE:
             item->_errorString = tr("Filename contains trailing spaces.");
             item->_status = SyncFileItem::FileNameInvalid;
-            maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded);
+            if (!maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded)) {
+                item->_errorString += QStringLiteral(" %1").arg(tr("Cannot be renamed or uploaded."));
+            }
             break;
         case CSYNC_FILE_EXCLUDE_LEADING_SPACE:
             item->_errorString = tr("Filename contains leading spaces.");
             item->_status = SyncFileItem::FileNameInvalid;
-            maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded);
+            if (!maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded)) {
+                item->_errorString += QStringLiteral(" %1").arg(tr("Cannot be renamed or uploaded."));
+            }
             break;
         case CSYNC_FILE_EXCLUDE_LEADING_AND_TRAILING_SPACE:
             item->_errorString = tr("Filename contains leading and trailing spaces.");
             item->_status = SyncFileItem::FileNameInvalid;
-            maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded);
+            if (!maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded)) {
+                item->_errorString += QStringLiteral(" %1").arg(tr("Cannot be renamed or uploaded."));
+            }
             break;
         case CSYNC_FILE_EXCLUDE_LONG_FILENAME:
             item->_errorString = tr("Filename is too long.");
@@ -475,7 +481,9 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
             }
             item->_errorString = reasonString.isEmpty() ? errorString : QStringLiteral("%1 %2").arg(errorString, reasonString);
             item->_status = SyncFileItem::FileNameInvalidOnServer;
-            maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded);
+            if (!maybeRenameForWindowsCompatibility(_discoveryData->_localDir + item->_file, excluded)) {
+                item->_errorString += QStringLiteral(" %1").arg(tr("Cannot be renamed or uploaded."));
+            }
             break;
         }
     }
@@ -2283,12 +2291,14 @@ void ProcessDirectoryJob::setupDbPinStateActions(SyncJournalFileRecord &record)
     }
 }
 
-void ProcessDirectoryJob::maybeRenameForWindowsCompatibility(const QString &absoluteFileName,
+bool ProcessDirectoryJob::maybeRenameForWindowsCompatibility(const QString &absoluteFileName,
                                                              CSYNC_EXCLUDE_TYPE excludeReason)
 {
+    auto result = true;
+
     const auto leadingAndTrailingSpacesFilesAllowed = !_discoveryData->_shouldEnforceWindowsFileNameCompatibility || _discoveryData->_leadingAndTrailingSpacesFilesAllowed.contains(absoluteFileName);
     if (leadingAndTrailingSpacesFilesAllowed) {
-        return;
+        return result;
     }
 
     const auto fileInfo = QFileInfo{absoluteFileName};
@@ -2312,10 +2322,11 @@ void ProcessDirectoryJob::maybeRenameForWindowsCompatibility(const QString &abso
     case CSYNC_FILE_EXCLUDE_TRAILING_SPACE:
     {
         const auto renameTarget = QString{fileInfo.absolutePath() + QStringLiteral("/") + fileInfo.fileName().trimmed()};
-        FileSystem::rename(absoluteFileName, renameTarget);
+        result = FileSystem::rename(absoluteFileName, renameTarget);
         break;
     }
     }
+    return result;
 }
 
 }
index d87114d8bd8194edb2c71b1349d6e8e8cbe0902c..a18fc601458a15a36a28c6675f6a6b6155dd59cb 100644 (file)
@@ -256,7 +256,7 @@ private:
      */
     void setupDbPinStateActions(SyncJournalFileRecord &record);
 
-    void maybeRenameForWindowsCompatibility(const QString &absoluteFileName,
+    bool maybeRenameForWindowsCompatibility(const QString &absoluteFileName,
                                             CSYNC_EXCLUDE_TYPE excludeReason);
 
     qint64 _lastSyncTimestamp = 0;